package Day18_网络编程.demo6_模拟BS软件;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author：pengzhilin
 * @Date: 2020/5/10 15:08
 */
public class Server {
    public static void main(String[] args) throws Exception {
        // http://localhost:9999/day18/web/index.html
        // 服务器程序 启动
        // 服务器:
        // 1.创建ServerSocket对象,指定端口号
        ServerSocket ss = new ServerSocket(9999);

        // 浏览器工作原理是遇到图片会开启一个线程进行单独的访问,因此在服务器端加入线程技术。
        while (true){
            // 2.调用accept()接收请求,返回Socket对象
            Socket socket = ss.accept();// 阻塞
            // 开启线程
            new Thread(()->{
                try{
                    System.out.println("连接成功....");
                    // 3.获取请求页面路径  希望得到: day18/web/index.html
                    // 由于浏览器会发送请求,所以请求信息就在连接通道中
                    // 可以通过Socket获得字节输入流对象,获得请求信息
                    InputStream is = socket.getInputStream();

                    // 把is字节输入流转换为字符输入流
                    InputStreamReader isr = new InputStreamReader(is);
                    // 把字符输入流isr转换为字符缓冲输入流BufferedReader
                    BufferedReader br = new BufferedReader(isr);

                    // 获得访问页面路径
                    String path = br.readLine().split(" ")[1].substring(1);
                    System.out.println(path);


                    // 4.创建字节输入流对象,关联要访问的页面的路径
                    FileInputStream fis = new FileInputStream(path);

                    // 5.通过Socket对象获得输出流
                    OutputStream os = socket.getOutputStream();

                    // 6.定义一个字节数组,用来存储读取到的字节数据
                    byte[] bys = new byte[8192];
                    // 7.定义一个变量,用来存储读取到的字节个数
                    int len;
                    // 8.循环读取

                    // 响应页面的时候需要同时把以下响应过去给浏览器
                    os.write("HTTP/1.1 200 OK\r\n".getBytes());
                    os.write("Content-Type:text/html\r\n".getBytes());
                    os.write("\r\n".getBytes());

                    while ((len = fis.read(bys)) != -1) {
                        // 9.在循环中,写出数据
                        os.write(bys,0,len);
                    }
                    // 10.释放资源
                    fis.close();
                    socket.close();

                }catch (Exception e){

                }
            }).start();
        }



    }
    // 获得浏览器需要访问的页面的路径
    private static void method01() throws IOException {
        // 1.创建ServerSocket对象,指定端口号
        ServerSocket ss = new ServerSocket(9999);
        // 2.调用accept()接收请求,返回Socket对象
        Socket socket = ss.accept();// 阻塞
        System.out.println("连接成功....");
        // 3.获取请求页面路径  希望得到: day18/web/index.html
        // 由于浏览器会发送请求,所以请求信息就在连接通道中
        // 可以通过Socket获得字节输入流对象,获得请求信息
        InputStream is = socket.getInputStream();

        // 去连接通道中读取8192个字节数据,看看有没有访问页面的路径
        //byte[] bys = new byte[8192];
        //int len = is.read(bys);
        //System.out.println(new String(bys,0,len));
        /*
            GET /day18/web/index.html HTTP/1.1
            Host: localhost:9999
            Connection: keep-alive
            Cache-Control: max-age=0
            Upgrade-Insecure-Requests: 1
            User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
            Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,**;q=0.8,application/signed-exchange;v=b3;q=0.9
            Sec-Fetch-Site: none
            Sec-Fetch-Mode: navigate
            Sec-Fetch-User: ?1
            Sec-Fetch-Dest: document
            Accept-Encoding: gzip, deflate, br
            Accept-Language: zh-CN,zh;q=0.9
            Cookie: Idea-fcda2818=3d8bb541-714d-427b-9ad6-0ec9519de1ad
         */
        // 连接通道中第一行数据有我们需要的访问页面路径,所以要想办法获取第一行数据(BufferedReader)
        // 把is字节输入流转换为字符输入流
        InputStreamReader isr = new InputStreamReader(is);
        // 把字符输入流isr转换为字符缓冲输入流BufferedReader
        BufferedReader br = new BufferedReader(isr);
        // 使用br字符缓冲输入对象读取连接通道中的第一行数据
        String path = br.readLine();
        System.out.println(path);// GET /day18/web/index.html HTTP/1.1

        // 从第一行数据中获取出访问页面路径
        String[] arr = path.split(" ");
        path = arr[1].substring(1);
        System.out.println("path:"+path);
    }
}
